- <a href = "F:\Node_projects\Node_Way\NBase\_Md\_Index\Perfect_Code\cat.Perfect_Code\dir.Perfect_Code.md">Perfect_Code</a>
    - <a href = "F:\Node_projects\Node_Way\NBase\_Md\_Index\Perfect_Code\ru\cat.ru\dir.ru.md">ru</a>
        - <a href = "F:\Node_projects\Node_Way\NBase\_Md\_Index\Perfect_Code\ru\exdf.ancors_2.md">exdf.ancors_2.md</a>
            - *## 1 Добро пожаловать в мир конструирования ПО 2
            - *### 1.1. Что такое конструирование ПО 2
            - *### 1.2. Почему конструирование ПО так важно 5
            - *### 1.3. Как читать эту книгу 6
            - *## 2 Метафоры, позволяющие лучше понять разработку ПО 8
            - *### 2.1. Важность метафор 8
            - *### 2.2. Как использовать метафоры 10
            - *### 2.3. Популярные метафоры, характеризующие разработку ПО 12
            - *## 3 Семь раз отмерь, один раз отрежь: предварительные условия 21
            - *### 3.1. Важность выполнения предварительных условий 22
            - *### 3.2. Определите тип ПО, над которым вы работаете 28
            - *### 3.3. Предварительные условия, связанные с определением проблемы 34
            - *### 3.4. Предварительные условия, связанные с выработкой требований 36
            - *### 3.5. Предварительные условия, связанные с разработкой архитектуры 41
            - *### 3.6. Сколько времени следует посвятить выполнению предварительных условий 52
            - *## 4 Основные решения, которые приходится принимать при конструировании 58
            - *### 4.1. Выбор языка программирования 59
            - *### 4.2. Конвенции программирования 63
            - *### 4.3. Волны развития технологий 64
            - *### 4.4. Выбор основных методик конструирования 66
            - *## 5 Проектирование при конструировании 70
            - *### 5.1. Проблемы, связанные с проектированием ПО 71
            - *### 5.2. Основные концепции проектирования 74
            - *### 5.3. Компоненты проектирования: эвристические принципы 84
            - *### 5.4. Методики проектирования 107
            - *### 5.5. Комментарии по поводу популярных методологий 115
            - *## 6 Классы 121
            - *### 6.1. Основы классов: абстрактные типы данных 122
            - *### 6.2. Качественные интерфейсы классов 129
            - *### 6.3. Вопросы проектирования и реализации 139
            - *### 6.4. Разумные причины создания классов 148
            - *### 6.5. Аспекты, специфические для языков 152
            - *### 6.6. Следующий уровень: пакеты классов 153
            - *## 7 Высококачественные методы 157
            - *### 7.1. Разумные причины создания методов 160
            - *### 7.2. Проектирование на уровне методов 163
            - *### 7.3. Удачные имена методов 167
            - *### 7.4. Насколько объемным может быть метод 169
            - *### 7.5. Советы по использованию параметров методов 170
            - *### 7.6. Отдельные соображения по использованию функций 177
            - *### 7.7. Методы-макросы и встраиваемые методы 178
            - *## 8 Защитное программирование 182
            - *### 8.1. Защита программы от неправильных входных данных 183
            - *### 8.2. Утверждения 184
            - *### 8.3. Способы обработки ошибок 189
            - *### 8.4. Исключения 193
            - *### 8.5. Изоляция повреждений, вызванных ошибками 198
            - *### 8.6. Отладочные средства 200
            - *### 8.7. Доля защитного программирования в промышленной версии 204
            - *### 8.8. Защита от защитного программирования 206
            - *## 9 Процесс программирования с псевдокодом 209
            - *### 9.1. Этапы создания классов и методов 210
            - *### 9.2. Псевдокод для профи 211
            - *### 9.3. Конструирование методов с использованием ППП 214
            - *### 9.4. Альтернативы ППП 225
            - *## 10 Общие принципы использования переменных 230
            - *### 10.1. Что вы знаете о данных? 231
            - *### 10.2. Грамотное объявление переменных 232
            - *### 10.3. Принципы инициализации переменных 233
            - *### 10.4. Область видимости 238
            - *### 10.5. Персистентность 245
            - *### 10.6. Время связывания 246
            - *### 10.7. Связь между типами данных и управляющими структурами 247
            - *### 10.8. Единственность цели каждой переменной 249
            - *## 11 Сила имен переменных 252
            - *### 11.1. Общие принципы выбора имен переменных 253
            - *### 11.2. Именование конкретных типов данных 257
            - *### 11.3. Сила конвенций именования 263
            - *### 11.4. Неформальные конвенции именования 264
            - *### 11.5. Стандартизованные префиксы 272
            - *### 11.6. Грамотное сокращение имен переменных 274
            - *### 11.7. Имена, которых следует избегать 277
            - *## 12 Основные типы данных 282
            - *### 12.1. Числа в общем 283
            - *### 12.2. Целые числа 284
            - *### 12.3. Числа с плавающей запятой 286
            - *### 12.4. Символы и строки 289
            - *### 12.5. Логические переменные 292
            - *### 12.6. Перечислимые типы 294
            - *### 12.7. Именованные константы 299
            - *### 12.8. Массивы 301
            - *### 12.9. Создание собственных типов данных (псевдонимы) 303
            - *## 13 Нестандартные типы данных 310
            - *### 13.1. Структуры 310
            - *### 13.2. Указатели 314
            - *### 13.3. Глобальные данные 326
            - *## 14 Организация последовательного кода 338
            - *### 14.1. Операторы, следующие в определенном порядке 338
            - *### 14.2. Операторы, следующие в произвольном порядке 342
            - *## 15 Условные операторы 346
            - *### 15.1. Операторы if 346
            - *### 15.2. Операторы case 353
            - *## 16 Циклы 359
            - *### 16.1. Выбор типа цикла 359
            - *### 16.2. Управление циклом 365
            - *### 16.3. Простое создание цикла — изнутри наружу 378
            - *### 16.4. Соответствие между циклами и массивами 379
            - *## 17 Нестандартные управляющие структуры 382
            - *### 17.1. Множественные возвраты из метода 382
            - *### 17.2. Рекурсия 385
            - *### 17.3. Оператор goto 389
            - *### 17.4. Перспективы нестандартных управляющих структур 401
            - *## 18 Табличные методы 404
            - *### 18.1. Основные вопросы применения табличных методов 405
            - *### 18.2. Таблицы с прямым доступом 406
            - *### 18.3. Таблицы с индексированным доступом 418
            - *### 18.4. Таблицы со ступенчатым доступом 419
            - *### 18.5. Другие примеры табличного поиска 422
            - *## 19 Общие вопросы управления 424
            - *### 19.1. Логические выражения 424
            - *### 19.2. Составные операторы (блоки) 436
            - *### 19.3. Пустые выражения 437
            - *### 19.4. Укрощение опасно глубокой вложенности 438
            - *### 19.5. Основа программирования: структурное программирование 448
            - *### 19.6. Управляющие структуры и сложность 450
            - *## 20 Качество ПО 456
            - *### 20.1. Характеристики качества ПО 456
            - *### 20.2. Методики повышения качества ПО 459
            - *### 20.3. Относительная эффективность методик контроля качества ПО 462
            - *### 20.4. Когда выполнять контроль качества ПО 466
            - *### 20.5. Главный Закон Контроля Качества ПО 467
            - *## 21 Совместное конструирование 471
            - *### 21.1. Обзор методик совместной разработки ПО 472
            - *### 21.2. Парное программирование 475
            - *### 21.3. Формальные инспекции 477
            - *### 21.4. Другие методики совместной разработки ПО 484
            - *### 21.5. Сравнение методик совместного конструирования 487
            - *## 22 Тестирование, выполняемое разработчиками 490
            - *### 22.1. Тестирование, выполняемое разработчиками, и качество ПО 492
            - *### 22.2. Рекомендуемый подход к тестированию, выполняемому разработчиками 494
            - *### 22.3. Приемы тестирования 496
            - *### 22.4. Типичные ошибки 507
            - *### 22.5. Инструменты тестирования 513
            - *### 22.6. Оптимизация процесса тестирования 518
            - *### 22.7. Протоколы тестирования 520
            - *## 23 Отладка 524
            - *### 23.1. Общие вопросы отладки 524
            - *### 23.2. Поиск дефекта 529
            - *### 23.3. Устранение дефекта 539
            - *### 23.4. Психологические аспекты отладки 543
            - *### 23.5. Инструменты отладки — очевидные и не очень 545
            - *## 24 Рефакторинг 551
            - *### 24.1. Виды эволюции ПО 552
            - *### 24.2. Введение в рефакторинг 553
            - *### 24.3. Отдельные виды рефакторинга 559
            - *### 24.4. Безопасный рефакторинг 566
            - *### 24.5. Стратегии рефакторинга 568
            - *## 25 Стратегии оптимизации кода 572
            - *### 25.1. Общее обсуждение производительности ПО 573
            - *### 25.2. Введение в оптимизацию кода 576
            - *### 25.3. Где искать жир и патоку? 583
            - *### 25.4. Оценка производительности 588
            - *### 25.5. Итерация 590
            - *### 25.6. Подход к оптимизации кода: резюме 591
            - *## 26 Методики оптимизации кода 595
            - *### 26.1. Логика 596
            - *### 26.2. Циклы 602
            - *### 26.3. Изменения типов данных 611
            - *### 26.4. Выражения 616
            - *### 26.5. Методы 625
            - *### 26.6. Переписывание кода на низкоуровневом языке 626
            - *### 26.7. Если что-то одно изменяется, что#то другое всегда остается постоянным 629
            - *## 27 Как размер программы влияет на конструирование 634
            - *### 27.1. Взаимодействие и размер 635
            - *### 27.2. Диапазон размеров проектов 636
            - *### 27.3. Влияние размера проекта на возникновение ошибок 636
            - *### 27.4. Влияние размера проекта на производительность 638
            - *### 27.5. Влияние размера проекта на процесс разработки 639
            - *## 28 Управление конструированием 645
            - *### 28.1. Поощрение хорошего кодирования 646
            - *### 28.2. Управление конфигурацией 649
            - *### 28.3. Оценка графика конструирования 655
            - *### 28.4. Измерения 661
            - *### 28.5. Гуманное отношение к программистам 664
            - *### 28.6. Управление менеджером 670
            - *## 29 Интеграция 673
            - *### 29.1. Важность выбора подхода к интеграции 673
            - *### 29.2. Частота интеграции — поэтапная или инкрементная 675
            - *### 29.3. Стратегии инкрементной интеграции 678
            - *### 29.4. Ежедневная сборка и дымовые тесты 686
            - *## 30 Инструменты программирования 694
            - *### 30.1. Инструменты для проектирования 695
            - *### 30.2. Инструменты для работы с исходным кодом 695
            - *### 30.3. Инструменты для работы с исполняемым кодом 700
            - *### 30.4. Инструменты и среды 704
            - *### 30.5. Создание собственного программного инструментария 705
            - *### 30.6. Волшебная страна инструментальных средств 707
            - *## 31 Форматирование и стиль 712
            - *### 31.1. Основные принципы форматирования 713
            - *### 31.2. Способы форматирования 720
            - *### 31.3. Стили форматирования 721
            - *### 31.4. Форматирование управляющих структур 728
            - *### 31.5. Форматирование отдельных операторов 736
            - *### 31.6. Размещение комментариев 747
            - *### 31.7. Размещение методов 750
            - *### 31.8. Форматирование классов 752
            - *## 32 Самодокументирующийся код 760
            - *### 32.1. Внешняя документация 760
            - *### 32.2. Стиль программирования как вид документации 761
            - *### 32.3. Комментировать или не комментировать 764
            - *### 32.4. Советы по эффективному комментированию 768
            - *### 32.5. Методики комментирования 774
            - *### 32.6. Стандарты IEEE 795
            - *## 33 Личность 800
            - *### 33.1. Причем тут характер 801
            - *### 33.2. Интеллект и скромность 802
            - *### 33.3. Любопытство 803
            - *### 33.4. Профессиональная честность 806
            - *### 33.5. Общение и сотрудничество 809
            - *### 33.6. Творчество и дисциплина 809
            - *### 33.7. Лень 810
            - *### 33.8. Свойства, которые менее важны, чем кажется 811
            - *### 33.9. Привычки 813
            - *## 34 Основы мастерства 817
            - *### 34.1. Боритесь со сложностью 817
            - *### 34.2. Анализируйте процесс разработки 819
            - *### 34.3. Пишите программы в первую очередь для людей и лишь во вторую —
            - *### 34.4. Программируйте с использованием языка, а не на языке 823
            - *### 34.5. Концентрируйте внимание с помощью соглашений 824
            - *### 34.6. Программируйте в терминах проблемной области 825
            - *### 34.7. Опасайтесь падающих камней 827
            - *### 34.8. Итерируйте, итерируйте и итерируйте 830
            - *### 34.9. И да отделена будет религия от разработки ПО 831
            - *## 35 Где искать дополнительную информацию 834
            - *### 35.1. Информация о конструировании ПО 835
            - *### 35.2. Не связанные с конструированием темы 836
            - *### 35.3. Периодические издания 838
            - *### 35.4. Список литературы для разработчика ПО 839
            - *### 35.5. Профессиональные ассоциации 841
            - *## Библиография 842
            - *## Предметный указатель 863
            - *## Об авторе 868
    
